package com.shuang.tree43;

public class DeleteNode {

    /*第一种情况：没找到删除的节点，遍历到空节点直接返回了
  找到删除的节点
  第二种情况：左右孩子都为空（叶子节点），直接删除节点， 返回NULL为根节点
  第三种情况：删除节点的左孩子为空，右孩子不为空，删除节点，右孩子补位，返回右孩子为根节点
  第四种情况：删除节点的右孩子为空，左孩子不为空，删除节点，左孩子补位，返回左孩子为根节点
  第五种情况：左右孩子节点都不为空，则将删除节点的左子树头结点（左孩子）放到删除节点的右子树的最左面节点的左孩子上，返回删除节点右孩子为新的根节点。*/
    public TreeNode deleteNode(TreeNode root, int key) {
        //1
        if (root == null) {
            return root;
        }

        //找到目标值
        if (root.val == key) {

            //2
            if (root.left == null && root.right == null) {
                return null;
                //3
            } else if (root.left == null && root.right != null) {
                return root.right;
                //4
            } else if (root.left != null && root.right == null) {
                return root.left;
            }
            //5
            else {
                //记录当前节点（要删除的节点）的右节点
                TreeNode cur = root.right;
                while (cur.left != null) {
                    //一直走到右节点的最左边的叶子节点
                    cur = cur.left;
                }
                //将当前节点的左节点连到 当前节点的右节点的最左边节点上
                cur.left = root.left;
                //删除当前节点 即将当前节点的右节点赋给他 然后返回
                root = root.right;
                return root;
            }
        }

        if (root.val > key)
            root.left = deleteNode(root.left, key);

        if (root.val < key)
            root.right = deleteNode(root.right, key);

        return root;
    }
}
